package org.eclipselabs.spray.xtext.util;
import org.eclipse.emf.codegen.ecore.genmodel.GenClass;
import org.eclipse.emf.codegen.ecore.genmodel.GenModel;
import org.eclipse.emf.codegen.ecore.genmodel.GenPackage;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EClassifier;
import org.eclipse.emf.ecore.plugin.EcorePlugin;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.xtext.naming.IQualifiedNameProvider;
import com.google.inject.Inject;
/**
* This class computes an EClass' Java class name from looking up the EClass' GenModel from the {@link EcorePlugin#getEPackageNsURIToGenModelLocationMap() EPackage to GenModel map}.
*
* @author Karsten Thoms
*/
public class GenModelHelper {
@Inject
private IQualifiedNameProvider qualifiedNameProvider;
@Inject
private ResourceSet resourceSet;
public String getJavaInterfaceName(EClass eClass) {
GenClass genClass = getGenClass(eClass);
return genClass != null ? genClass.getQualifiedInterfaceName() : null;
}
public String getEPackageClassName(EClass eClass) {
GenClass genClass = getGenClass(eClass);
return genClass != null ? genClass.getGenPackage().getQualifiedPackageInterfaceName() : null;
}
public String getEFactoryInterfaceName(EClass eClass) {
GenClass genClass = getGenClass(eClass);
return genClass != null ? genClass.getGenPackage().getQualifiedFactoryInterfaceName() : null;
}
public String getLiteralConstant(EClass eClass) {
GenClass genClass = getGenClass(eClass);
if (genClass == null) {
return null;
} else {
return genClass.getClassifierID();
}
}
public String getFileExtension(EClass eClass) {
GenPackage pck = getGenPackage(eClass);
return pck.getFileExtension();
}
protected GenClass getGenClass(EClass eClass) {
GenModel genModel = getGenModel(eClass);
for (GenPackage pck : genModel.getAllGenPackagesWithClassifiers()) {
for (GenClass genClass : pck.getGenClasses()) {
EClass c = genClass.getEcoreClass();
// Normally we would just compare the EClasses, but it might be that they came from different URIs.
// In a unit test the Ecore model is read for example with a classpath URI, while the Genmodel refers to the same
// EClasses from a platform URI.
// As a workaround we compute the qualified names of the EClasses. This workaround should be removed later when possible.
if (qualifiedNameProvider.getFullyQualifiedName(eClass).equals(qualifiedNameProvider.getFullyQualifiedName(c))) {
return genClass;
}
}
}
return null;
}
protected GenPackage getGenPackage(EClass eClass) {
GenModel genModel = getGenModel(eClass);
for (GenPackage pck : genModel.getAllGenPackagesWithClassifiers()) {
for (GenClass genClass : pck.getGenClasses()) {
EClass c = genClass.getEcoreClass();
// Normally we would just compare the EClasses, but it might be that they came from different URIs.
// In a unit test the Ecore model is read for example with a classpath URI, while the Genmodel refers to the same
// EClasses from a platform URI.
// As a workaround we compute the qualified names of the EClasses. This workaround should be removed later when possible.
if (qualifiedNameProvider.getFullyQualifiedName(eClass).equals(qualifiedNameProvider.getFullyQualifiedName(c))) {
return pck;
}
}
}
return null;
}
public GenModel getGenModel(EClassifier eClassifier) {
if (eClassifier.eIsProxy()) {
throw new IllegalStateException("Cannot determine interface name for EClass, since the EClass is an unresolved proxy (" + EcoreUtil.getURI(eClassifier) + ")");
}
URI genModelUri = EcorePlugin.getEPackageNsURIToGenModelLocationMap().get(eClassifier.getEPackage().getNsURI());
if (genModelUri == null) {
throw new IllegalStateException("GenModel for EPackage '" + eClassifier.getEPackage().getNsURI() + "' must be registered.");
}
Resource res = resourceSet.getResource(genModelUri, true);
EcoreUtil.resolveAll(res);
GenModel genModel = (GenModel) res.getContents().get(0);
return genModel;
}
}